package Y20251125;

class Solution {


    /** 位1的个数
     *  n&(n-1)这个值就是可以减少一位1
     * @param n
     * @return
     */
    public int hammingWeight(int n) {
        int count = 0;
        while(n != 0){
            n = n&(n-1);
            count++;
        }
        return count;
    }

    /**
     * 判断字符是否唯一
     * 可以有多种方法，但是用位运算是最好的，时间：O(N) 空间；O(1) 而且这道题明确说明了只有26个小写英文字母
     * 所以根据鸽巢原理，可以得到，这个字符串只要是大于26则说明这个字符串有重复的字符
     * @param astr
     * @return
     */
    public boolean isUnique(String astr) {
        if(astr.length() > 26) return false;
        int num = 0;
        for(int i = 0 ; i < astr.length(); i++){
            if(((num>>(astr.charAt(i)-'a')) & 1) == 1)
                // 第(ch-'a')位是1
                return false;
            else{
                // 第(ch-'a')位是0
                num |= 1<<(astr.charAt(i)-'a');
            }
        }
        return true;
    }
}